import java.net.*;
import java.util.*;
import java.io.*;

public class Jugador extends Thread
{
	String nombre;
	Socket socket;
	Servidor servidor;
	Partida partida;
	Nave nave;
	BufferedReader entrada;
	PrintWriter salida;

	//El parametro socket es para escuchar al cliente
	public Jugador(String nombre, Socket socket, Servidor servidor)
	{
		this.nombre = nombre;
		this.socket = socket;
		this.servidor = servidor;
		this.partida = null;
		this.nave = null;
		try
		{
			this.entrada = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));;
			this.salida = new PrintWriter(new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream())), true);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			return;
		}
	}

	public void enviarEstado()
	{
		this.salida.println(XmlServidor.estadoDePartida(this.partida, nombre));
	}

	public void run()
	{
		boolean continuar = true;
		String xmlRecibido, string, xmlEnviado = "";
		Teclado teclado = null;

		while (continuar)
		{
			/*try
			{
				xmlRecibido = this.entrada.readLine();
			}
			catch (Exception e)
			{
				this.partida.actualizar();
				this.salida.println(XmlServidor.estadoDePartida(this.partida));
				continue;
			}*/
			try
			{
				xmlRecibido = this.entrada.readLine();
				if (xmlRecibido == null)
				{
					servidor.removerJugador(this.nombre);
					continuar = false;
				}
				XmlServidor xml = new XmlServidor(xmlRecibido);
				comandosEnum comando = xml.identificarXml();
				switch (comando)
				{
					case TECLAS:
						teclado = xml.teclas();
						this.partida.modificar(teclado, nombre);
						//xmlEnviado = XmlServidor.estadoDePartida(this.partida);
						break;
					case MENSAJE:
						string = xml.mensajeChat();
						servidor.enviarMensaje("<mensaje>" + nombre + "> " + string + "</mensaje>");
						break;
					case LISTA_DE_PARTIDAS:
						xmlEnviado = XmlServidor.listaDePartidas(servidor.partidas);
						break;
					case CREAR_PARTIDA:
						string = xml.nombrePartida();
						if (servidor.crearPartida(string))
						{
							if (servidor.agregarJugadorAPartida(this.nombre, string))
							{
								partida.start();
								//this.socket.setSoTimeout(50);
								xmlEnviado = "<resultado><comando>crear_partida</comando><valor>true</valor></resultado>";
							}
						}
						else
						{
							xmlEnviado = "<resultado><comando>crear_partida</comando><valor>false</valor></resultado>";
						}
						break;
					case CONECTAR_PARTIDA:
						string = xml.nombrePartida();
						if (servidor.agregarJugadorAPartida(this.nombre, string))
						{
							//this.socket.setSoTimeout(50);
							xmlEnviado = "<resultado><comando>conectar_partida</comando><valor>true</valor></resultado>";
						}
						else
						{
							xmlEnviado = "<resultado><comando>conectar_partida</comando><valor>false</valor></resultado>";
						}
						break;
					case SALIR:
						xmlEnviado = XmlServidor.salir();
						servidor.removerJugador(this.nombre);
						System.out.println("El jugador " + this.nombre + " salio del juego.");
						continuar = false;
					case DESCONOCIDO:
						break;
				}
				this.salida.println(xmlEnviado);
				xmlEnviado = "";
			}
			catch (Exception e)
			{
				//e.printStackTrace();
			}
		}
		try
		{
			this.salida.close();
			this.entrada.close();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	String getNombre()
	{
		return this.nombre;
	}

	void setNombre(String nombre)
	{
		this.nombre = nombre;
	}

	Socket getSocket()
	{
		return this.socket;
	}

	Nave getNave()
	{
		return this.nave;
	}

	void setNave(Nave nave)
	{
		this.nave = nave;
	}

	Partida getPartida()
	{
		return this.partida;
	}

	void setPartida(Partida partida)
	{
		this.partida = partida;
	}
}
